// HoverButton.cpp : implementation file
//

#include "stdafx.h"
#include "HoverButton.h"
#include "../others/MinimizeBitmaps52x13.h"
#include "../others/SetRawPixels.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHoverButton

CHoverButton::CHoverButton()
{
    m_bHover = FALSE;
    m_bTracking = FALSE;

    m_bOpenState = true;
}

CHoverButton::~CHoverButton()
{}
IMPLEMENT_DYNAMIC(CHoverButton, CBitmapButton)

BEGIN_MESSAGE_MAP(CHoverButton, CBitmapButton)
    //{{AFX_MSG_MAP(CHoverButton)
    ON_WM_MOUSEMOVE()
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
    ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////
//	CHoverButton message handlers

void CHoverButton::OnMouseMove(UINT nFlags, CPoint point)
{
    //	TODO: Add your message handler code here and/or call default

    if(!m_bTracking) {
        TRACKMOUSEEVENT tme;
        tme.cbSize = sizeof(tme);
        tme.hwndTrack = m_hWnd;
        tme.dwFlags = TME_LEAVE | TME_HOVER;
        tme.dwHoverTime = 1;
        m_bTracking = _TrackMouseEvent(&tme);
    }
    CBitmapButton::OnMouseMove(nFlags, point);
}

BOOL CHoverButton::PreTranslateMessage(MSG *pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    InitToolTip();
    m_ToolTip.RelayEvent(pMsg);
    return CButton::PreTranslateMessage(pMsg);
}

// Set the tooltip with a string resource
void CHoverButton::SetToolTipText(int nId, BOOL bActivate)
{
    CString sText;

    // load string resource
    sText.LoadString(nId);
    // If string resource is not empty
    if(sText.IsEmpty() == FALSE) SetToolTipText(&sText, bActivate);
}

// Set the tooltip with a CString
void CHoverButton::SetToolTipText(CString *spText, BOOL bActivate)
{
    // We cannot accept NULL pointer
    if(spText == NULL) return;

    // Initialize ToolTip
    InitToolTip();

    // If there is no tooltip defined then add it
    if(m_ToolTip.GetToolCount() == 0) {
        CRect rectBtn;
        GetClientRect(rectBtn);
        m_ToolTip.AddTool(this, (LPCTSTR)*spText, rectBtn, 1);
    }

    // Set text for tooltip
    m_ToolTip.UpdateTipText((LPCTSTR)*spText, this, 1);
    m_ToolTip.Activate(bActivate);
}

void CHoverButton::InitToolTip()
{
    if(m_ToolTip.m_hWnd == NULL) {
        // Create ToolTip control
        m_ToolTip.Create(this);
        // Create inactive
        m_ToolTip.Activate(FALSE);
    }
} // End of InitToolTip

// Activate the tooltip
void CHoverButton::ActivateTooltip(BOOL bActivate)
{
    // If there is no tooltip then do nothing
    if(m_ToolTip.GetToolCount() == 0) return;

    // Activate tooltip
    m_ToolTip.Activate(bActivate);
} // End of EnableTooltip

void CHoverButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    CRect r;
    GetClientRect(&r);

    CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    pDC->SaveDC();

    //	COLORREF c = RGB(0,0,0);
    //	if( lpDrawItemStruct->itemState & ODS_SELECTED )
    //	{
    //		c = RGB(0,255,0);
    //	}
    //	else
    //	{
    //		if( m_bHover )
    //		{
    //			c = RGB(255,0,0);
    //		}
    //	}
    //	CPen pen;
    //	pen.CreatePen(PS_SOLID,0,c);
    //	pDC->SelectObject(&pen);
    //	pDC->Rectangle(r);

    CRect sr(0, 0, 13, 13);

    if(m_bHover) {
        sr.OffsetRect(13 * 2, 0);
    }

    if(m_bOpenState) {
        sr.OffsetRect(13, 0);
    }

    SetRawPixels(pDC, MinimizeBitmaps, &CRect(0, 0, 13, 13), &sr);

    pDC->RestoreDC(-1);
}

// Load a bitmap from the resources in the button, the bitmap has to have 3 buttonsstates next to each other: Up/Down/Hover
BOOL CHoverButton::LoadBitmap(UINT bitmapid)
{
    mybitmap.Attach(::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(bitmapid), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS));
    BITMAP	bitmapbits;
    mybitmap.GetBitmap(&bitmapbits);
    m_ButtonSize.cy = bitmapbits.bmHeight;
    m_ButtonSize.cx = bitmapbits.bmWidth / 3;
    SetWindowPos(NULL, 0, 0, m_ButtonSize.cx, m_ButtonSize.cy, SWP_NOMOVE | SWP_NOOWNERZORDER);
    return TRUE;
}

LRESULT CHoverButton::OnMouseHover(WPARAM wparam, LPARAM lparam)
{
    // TODO: Add your message handler code here and/or call default
    m_bHover = TRUE;
    Invalidate();
    return 0;
}

void CHoverButton::SetState(bool bOpen)
{
    m_bOpenState = bOpen;
}

LRESULT CHoverButton::OnMouseLeave(WPARAM wparam, LPARAM lparam)
{
    m_bTracking = FALSE;
    m_bHover = FALSE;
    Invalidate();
    return 0;
}